﻿#ifndef FLOWCHART_H
#define FLOWCHART_H

#include <QWidget>
#include <QFileDialog>
#include <QKeyEvent>
#include <QTimer>
#include <QDateTime>
#include <QTableWidgetItem>
#include <QFile>
#include <QDir>
#include <QMessageBox>
#include "OpcUA/opcua_qthread.h"
#include "DisplayWidget/flowdata.h"

namespace Ui {
class FlowChart;
}

class OpcUA_QThread;

class FlowChart : public QWidget
{
    Q_OBJECT

public:
    explicit FlowChart(OpcUA_QThread * opcUA, QWidget *parent = nullptr);
    ~FlowChart();

public slots:
    void on_receiveTemperature(int16_t temperature1, int16_t temperature2);

signals:
    void logOutput(QString log);

    //下面两个是开始运行，与停止运行的信号。用来发送给保存数据库的界面用，目前在Mainwindow绑定给了HomePage
    void signals_flowChartStart();
    void signals_flowChartStop();

    void signals_sendDesiredValue(QVector<int16_t> flowmeter, QVector<int16_t> pressuremeter);

private slots:

    //修改数据触发
    void onTableItemChanged(QTableWidgetItem* changedItem);

    //删除与插入函数
    void on_pushButton_deleteRow_clicked();
    void on_pushButton_insertRowAbove_clicked();

    //导出excel函数
    void on_pushButton_exportToExcel_clicked();

    //开始、停止、保存数据函数
    void on_pushButton_start_clicked();
    void on_pushButton_saveSetting_clicked();
    void on_pushButton_stop_clicked();

    //主流程，执行程序用，定时器槽函数
    void onTimerTimeout();

    void onParamRangeError(const QString& errMsg);  //接收FlowData的参数错误信号
    void onWriteSuccess(const QString& msg);         //接收FlowData的写入成功信号

protected:
    void keyPressEvent(QKeyEvent *event) override;  //重写键盘事件处理函数

private:
    void InitTableHeader();              //初始化表格表头
    void exportToExcel();                //导出表格数据到CSV
    void setColumnsNonEdit();            //设置不可编辑列
    QString escapeCsv(const QString& text);  //CSV特殊字符转义
    void resetAllRowBgColor();           //重置所有数据行背景色
    void setCurrentStepRowBgColor(int stepIndex);  //设置当前步骤行背景色
    void updateStepNumbers();           //更新Step列编号
    void sendDesiredValue(QVector<FlowParam> params, int currentStepIndex); //设置期望值

private:
    Ui::FlowChart *ui;
    FlowData *m_flowData;                //数据处理对象
    QTimer *m_flowTimer;                 //流程定时器
    int m_currentStepIndex = 0;          //当前执行步骤索引
    static const int HEADER_ROW_COUNT = 2;  //伪表头行数
    qint64 m_timerStartTime = 0;         //定时器启动时间（毫秒）
    QColor m_originalRowBgColor;         //表格原始背景色

};

#endif // FLOWCHART_H
